package com.welinkcredit.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.ObjectMetadata;
/**
 * 
 *@ClassName: TestOSS
 * 
 *@Description: 该示例代码展示了如果在OSS中创建和删除一个Bucket，以及如何上传和下载一个文件。
 * 
 * 该示例代码的执行过程是：
 * 1. 创建一个Bucket（如果已经存在，则忽略错误码）；
 * 2. 上传一个文件到OSS；
 * 3. 下载这个文件到本地；
 * 4. 清理测试资源：删除Bucket及其中的所有Objects。
 * 
 * 尝试运行这段示例代码时需要注意：
 * 1. 为了展示在删除Bucket时除了需要删除其中的Objects,
 *    示例代码最后为删除掉指定的Bucket，因为不要使用您的已经有资源的Bucket进行测试！
 * 2. 请使用您的API授权密钥填充ACCESS_ID和ACCESS_KEY常量；
 * 3. 需要准确上传用的测试文件，并修改常量uploadFilePath为测试文件的路径；
 *    修改常量downloadFilePath为下载文件的路径。
 * 4. 该程序仅为示例代码，仅供参考，并不能保证足够健壮。
 *OSS Java API手册：http://aliyun_portal_storage.oss.aliyuncs.com/oss_api/oss_javahtml/index.html?spm=5176.7150518.1996836753.8.d5TjaG
 *OSS Java SDK开发包:http://help.aliyun.com/view/13438814.html
 *OSSClient:www.mvnrepository.com/artifact/cglib/cglib/2.2
 *@author PineTree
 *@date 2014年12月1日 下午3:23:32
 *@version
 */
public class OSSUtil {
	/**
	 * 阿里云ACCESS_ID
	 */
	public static String ACCESS_ID = "LTAIBe60wkEm2GQU";
	/**
	 * 阿里云ACCESS_KEY 
	 */
	public static String ACCESS_KEY = "wMaecciOOfXacx05VpiWfiwbVv0L0V";
	/**
	 * 阿里云OSS_ENDPOINT  杭州Url
	 */
	public static String OSS_ENDPOINT ="oss-cn-beijing.aliyuncs.com";
	/**
	 * 阿里云BUCKET_NAME  OSS
	 */
	public static String BUCKET_NAME = "mytest20170806";
	
	
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		String Objectkey = "theTestD/testTxt.txt";//上传至服务器中的文件的名字
		String uploadFilePath = "D:\\testForTxt.txt";//本次测试使用，uploadFilePath代表要上传至服务器的文件的路径
	    OSSClient client = new OSSClient(OSS_ENDPOINT, ACCESS_ID, ACCESS_KEY);
	    
	    //测试获取PresignedUrl
	    Date now = new Date();//获取当前时间，用来设置PresignedUrl的有效时间
	    String desFileName = "theTestD/testTxt.txt";
//	    URL testUrl = client.generatePresignedUrl(BUCKET_NAME,desFileName,new Date(now.getTime()+5*60000));//60000代表一分钟
//	    System.out.println(testUrl.toString());
	    String url = getPresignedUrl(client, desFileName);
	    System.out.println(url);
	    //测试上传文件
//	    	setBucketPrivate(client, BUCKET_NAME);在OSS服务器中已经设置为Private了，所以不需要
//        try {
//			uploadFile(client, BUCKET_NAME, Objectkey, uploadFilePath);
//		} catch (OSSException e) {
//			e.printStackTrace();
//		} catch (ClientException e) {
//			e.printStackTrace();
//		} catch (FileNotFoundException e) {
//			e.printStackTrace();
//		}
	}
	
	private static void setBucketPrivate(OSSClient client, String bucketName) {
		//创建bucket
		client.createBucket(bucketName);
		//设置bucket的访问权限，
		client.setBucketAcl(bucketName, CannedAccessControlList.Private);
		
	}
	
	/**
	 * 上传文件
	 * 
	 * @param client  OSSClient对象
	 * @param bucketName  Bucket名
	 * @param Objectkey  上传到OSS起的名
	 * @param filename  本地文件名
	 * @throws OSSException
	 * @throws ClientException
	 * @throws FileNotFoundException
	 */
	public static void uploadFile(OSSClient client, String bucketName, String Objectkey, String filename)
			throws OSSException, ClientException, FileNotFoundException{
		File file = new File(filename);
		ObjectMetadata objectMeta = new ObjectMetadata();
		objectMeta.setContentLength(file.length());
		//获取格式
		String contentType = getContentType(filename.substring(filename.lastIndexOf(".")));
		objectMeta.setContentType(contentType);
		InputStream input = new FileInputStream(file);
		client.putObject(bucketName, Objectkey, input, objectMeta);
	}
	
	public static String getContentType(String FilenameExtension) {  
        if (FilenameExtension.equals(".BMP") || FilenameExtension.equals(".bmp")) {  
            return "image/bmp";  
        }  
        if (FilenameExtension.equals(".GIF") || FilenameExtension.equals(".gif")) {  
            return "image/gif";  
        }  
        if (FilenameExtension.equals(".JPEG") || FilenameExtension.equals(".jpeg") || FilenameExtension.equals(".JPG")  
                || FilenameExtension.equals(".jpg") || FilenameExtension.equals(".PNG")  
                || FilenameExtension.equals(".png")) {  
            return "image/jpeg";  
        }  
        if (FilenameExtension.equals(".HTML") || FilenameExtension.equals(".html")) {  
            return "text/html";  
        }  
        if (FilenameExtension.equals(".TXT") || FilenameExtension.equals(".txt")) {  
            return "text/plain";  
        }  
        if (FilenameExtension.equals(".VSD") || FilenameExtension.equals(".vsd")) {  
            return "application/vnd.visio";  
        }  
        if (FilenameExtension.equals(".PPTX") || FilenameExtension.equals(".pptx") || FilenameExtension.equals(".PPT")  
                || FilenameExtension.equals(".ppt")) {  
            return "application/vnd.ms-powerpoint";  
        }  
        if (FilenameExtension.equals(".DOCX") || FilenameExtension.equals(".docx") || FilenameExtension.equals(".DOC")  
                || FilenameExtension.equals(".doc")) {  
            return "application/msword";  
        }  
        if (FilenameExtension.equals(".XML") || FilenameExtension.equals(".xml")) {  
            return "text/xml";  
        }  
        if (FilenameExtension.equals(".apk") || FilenameExtension.equals(".APK")) {  
            return "application/octet-stream";  
        }  
        return "text/html";  
    }  
	public static void uploadFile(OSSClient client, String bucketName, String Objectkey, String filename,File file)
			throws OSSException, ClientException, FileNotFoundException{
		//File file = new File(filename);
		ObjectMetadata objectMeta = new ObjectMetadata();
		objectMeta.setContentLength(file.length());
		//判断上传类型，多的可根据自己需求来判定
		String contentType = getContentType(filename.substring(filename.lastIndexOf(".")));
		objectMeta.setContentType(contentType);
		InputStream input = new FileInputStream(file);
		client.putObject(bucketName, Objectkey, input, objectMeta);
	}
	
	public static String getPresignedUrl(OSSClient ossClient,String goalFile){
		Date nowTime = new Date();
		URL goalUrl = ossClient.generatePresignedUrl(OSSUtil.BUCKET_NAME, goalFile,new Date(nowTime.getTime()+60000*5));
		String url = goalUrl.toString();
		return url;
	}
}

